---@class GT.unitInit 单位物编创建初始化系统
GT.unitInit = class()

---@type table<UnitKey,unitInit_data>  初始化的单位数据
unitInit = OrderedTable()

---@alias UNIT_BORN_monster fun(u: GT.unit,data:unitInit_data):void

---@class unitInit_data 单位创建初始化参数列表
---@field uk UnitKey 单位编号
---@field monster monsterCreate 建筑单位生成出怪(从身体里生成单位)
---@field create UNIT_BORN_monster 单位出生回调
---@field die UNIT_DIE 单位死亡回调
---@field attr table<uKeyAttr,number> 单位属性 (初始化默认情况)
---@field kv kv_class[] 自定义键值
---@field skills AbilityKey[] 单位技能列表
---@field reward table<string,number> 单位被击杀属性
---@field build_lvup table<number,build_lvup_class> 建筑单位升级参数
---@field sk19 number 升级技能ID
---@field sk20 number 贩卖技能ID
---@field build_skill number 建筑绑定的建造技能

---@alias build_lvup_fun fun(u:GT.unit,lv_data:build_lvup_class,init_data: unitInit_data):viod 建筑升级回调函数

---@class build_lvup_class 建筑单位升级内容
---@field text string 描述
---@field lvup_fun build_lvup_fun 升级回调
---@field gold number 消耗金币
---@field pop number 消耗人口
---@field attr table<uKeyAttr,number> 单位属性
---@field skills AbilityKey[] 单位技能列表

---@class monsterCreate 单位身体里生成怪
---@field uk UnitKey 单位编号
---@field time number 出怪循环时间 -1为不循环
---@field num number 创建数量 默认 1

---@alias UNIT_BORN_Create_fun fun():void

---@type table<UnitID,UNIT_BORN_Create_fun> 单位初始化创建
unitInit_Create_fun=OrderedTable()


---@param data unitInit_data[]
function GT.unitInit:ctor(data)
    for i, v in ipairs(data) do
        unitInit[v.uk] = v
    end
end

---@param ukData unitInit_data[]
---@return GT.unitInit
function GT.unitInit.obj(ukData)
    return new(GT.unitInit, ukData)
end

---添加单位出生执行函数
---@param uid UnitID 单位id
---@param call UNIT_BORN_Create_fun  单位出生执行函数
function GT.unitInit.add_Create(uid,call)
    unitInit_Create_fun[uid]=call
end






---单位出生
GT.event.UNIT_BORN(function(u)
    local d = unitInit[u:get_UnitKey()]
    
    if d ~= nil then
        
        ---初始化属性
        if d.attr ~= nil then
            u:diy_add_attr(d.attr)
        end
        if d.create ~= nil then
            d.create(u, d)
        end

        ---设置自定义键值
        if d.kv ~= nil then
            for k, v in pairs(d.kv) do
                u:set(v.K, v.V, v.call)
            end
        end


        if d.sk19 ~= nil then
            u:api_add_ability(d.sk19, AbilityIndex['升级'], 1)
        end
        if d.sk20 ~= nil then
            u:api_add_ability(d.sk20, AbilityIndex['出售'], 1)
        end

        if d.monster ~= nil then
            local num = d.monster.num or 1
            local time = d.monster.time or -1
            if time > 0 then
                local t = GT.timer.obj({
                    count = -1,
                    delay = time,
                    immediately = false,
                    callback = function(data, t)
                        local p = u:api_get_position()
                        for i = 1, num, 1 do
                            GT.unit.create_unit(d.monster.uk, p, 0, u:get_player())
                        end
                    end
                })
                u:set('出怪计时器对象', t, nil)
            end
        end
        if d.skills ~= nil then
            for k, v in pairs(d.skills) do
                u:add_ability_index(v)

            end
        end
        if d.reward ~= nil then
            for k, v in pairs(d.reward) do
                u:api_set_unit_reward_res(k, v)
            end
        end

        if d.build_lvup ~= nil then
            u:set('建筑升级', d.build_lvup, nil)
            u:set('建筑等级', 0, nil)
        end
        if d.build_skill ~= nil then
            u:set('绑定建造技能', d.build_skill, nil)
        end
    end
end)


---单位死亡
GT.event.UNIT_DIE(function(u)
    local d = self.ukData[u:get_UnitKey()]
    if d ~= nil then
        d.die(u)
    end
end)
